﻿using System;
using System.Collections.Generic;
using System.Web;
using System.Web.Security;
using System.Web.SessionState;
using ZLDC.Common.Estate;

namespace ZLDC.Estate
{

    public class Global : System.Web.HttpApplication
    {
        public readonly static string sUserOnlineSwitch = "Lpgl-UserOnlineSwitch";//在线统计开关

        protected void Application_Start(object sender, EventArgs e)
        {
            //Application[sUserOnlineSwitch] = 0;//1 开启, 0 关闭

        }

        protected void Session_Start(object sender, EventArgs e)
        {

        }

        protected void Application_BeginRequest(object sender, EventArgs e)
        {
            // 重写 url
            //string url = Request.RawUrl.ToString();

            //string guid = Guid.NewGuid().ToString();
            //if (url.Contains("?"))
            //    url += "&guid=" + guid;
            //else
            //    url += "?guid=" + guid;

            //HttpContext.Current.RewritePath(url);
        }
        protected void Application_PostRequestHandlerExecute(Object sender, EventArgs e)
        {
            //if (Application[sUserOnlineSwitch].ToString() == "1")
            //{
            //    //更新当前用户最后访问状态
            //    UpdateCurrentUser();
            //}
        }

        protected void Application_AuthenticateRequest(object sender, EventArgs e)
        {

        }

        protected void Application_Error(object sender, EventArgs e)
        {
            //string outmsg = "发生异常的页:" + Request.Url.ToString() + "\r\n";

            //Exception ex = Server.GetLastError().GetBaseException();
            //outmsg += "异常信息：" + ex.Message + "\r\n";                                                           // 错误的信息            
            //outmsg += "异常方法：" + ex.TargetSite.DeclaringType.FullName + "." + ex.TargetSite.Name + "\r\n";      // 出错的方法名          
            //outmsg += "详细信息：" + ex.StackTrace.ToString() + "\r\n";                                             // 错误的堆栈 
            //Server.ClearError();

            ////if (Request.Url.ToString().Equals(".cs"))
            ////{
            //    ZLDC.Common.Estate._Log.SaveMessage(outmsg);                                                            // 保存出错信息
            //    ZLDC.Common.Estate._Utility.GoError("系统繁忙，请稍候...");
            ////}
        }
        
        protected void Session_End(object sender, EventArgs e)
        {
            //在线列表中删除当前用户
            //DeleteCurrentUser();
        }

        protected void Application_End(object sender, EventArgs e)
        {

        }

        /// <summary>
        /// 取得在线用户表
        /// </summary>
        /// <returns></returns>
        public static System.Data.DataTable GetUserOnline()
        {
            //防止当前用户被删除
            UpdateCurrentUser();
            //删除超时用户
            DeleteOvertimeUser();
           

            string sSql = "select * from t_usr_online";
            if (_Utility.GetInfoBySession().m_sRoleID != "1")
            {
                sSql += " where dept_id in (" + _Utility.GetInfoBySession().m_sDlIdList + ")";
            }

            System.Data.DataTable dt = null;
            using (_Database db = new _Database("estate")) 
            {
                System.Data.DataSet ds = db.Query(sSql);
                if (ds.Tables[0].Rows.Count > 0) 
                {
                    dt = ds.Tables[0];
                }
               
            }
            
            return dt;
        }


        /// <summary>
        /// 更新当前用户的在线资料
        /// </summary>
        /// <param name="userId"></param>
        private static void UpdateCurrentUser()
        {
            try
            {
                if (System.Web.HttpContext.Current.Session["info"] == null || System.Web.HttpContext.Current.Session["info"].ToString() == "")
                {
                    return;
                }
                else
                {
                    System.Text.StringBuilder sbSql = new System.Text.StringBuilder();
                    sbSql.Append("if exists(select [user_id] from t_usr_online where [user_id] = ");
                    sbSql.Append(_Utility.GetInfoBySession().m_sUserID);
                    sbSql.Append(")");
                    sbSql.Append(" begin");
                    sbSql.Append(" update t_usr_online set last_time = getdate(),ip = '");
                    sbSql.Append(System.Web.HttpContext.Current.Request.UserHostAddress);
                    sbSql.Append("',last_url = '");
                    sbSql.Append(System.Web.HttpContext.Current.Request.Url.ToString().Replace("'","''"));
                    sbSql.Append("' where user_id = ");
                    sbSql.Append(_Utility.GetInfoBySession().m_sUserID);
                    sbSql.Append(";");
                    sbSql.Append(" end else begin ");
                    sbSql.Append(" insert into t_usr_online (user_id,user_name,role_name,dept_id,dept_name,start_time,last_time,ip,last_url) values (");
                    sbSql.Append(_Utility.GetInfoBySession().m_sUserID);
                    sbSql.Append(",'");
                    sbSql.Append(_Utility.GetInfoBySession().m_sUserName);
                    sbSql.Append("','");
                    sbSql.Append(SelectRoleNameByRoleId(_Utility.GetInfoBySession().m_sRoleID));
                    sbSql.Append("',");
                    sbSql.Append(_Utility.GetInfoBySession().m_sDeptID);
                    sbSql.Append(",'");
                    sbSql.Append(_Utility.GetInfoBySession().m_sDeptName);
                    sbSql.Append("',getdate(),getdate(),'");
                    sbSql.Append(System.Web.HttpContext.Current.Request.UserHostAddress);
                    sbSql.Append("','");
                    sbSql.Append(System.Web.HttpContext.Current.Request.Url.ToString());
                    sbSql.Append("');");
                    sbSql.Append(" end;");
                    using (_Database db = new _Database("estate")) 
                    {
                        db.ExecuteSql(sbSql.ToString());
                    }
                }
            }
            catch
            {

            }
        }


        /// <summary>
        /// 删除当前用户
        /// </summary>
        private void DeleteCurrentUser()
        {
            try
            {
                if (System.Web.HttpContext.Current.Session["info"] == null || System.Web.HttpContext.Current.Session["info"].ToString() == "")
                {
                    return;
                }
                else
                {
                    string sSql = "delete t_usr_online where user_id = " + _Utility.GetInfoBySession().m_sUserID;
                    using (_Database db = new _Database("estate")) 
                    {
                        db.ExecuteSql(sSql);
                    }
                }
            }
            catch (Exception ex)
            {

            }
        }

        /// <summary>
        /// 在线表中删除超时用户
        /// </summary>
        public static void DeleteOvertimeUser()
        {
            
            string sSql = "delete from t_usr_online where last_time < dateadd(mi,-8,getdate())";
            using (_Database db = new _Database("estate"))
            {
                db.ExecuteSql(sSql);
            }
        }
        /// <summary>
        /// 返回角色名称
        /// </summary>
        /// <param name="roleId"></param>
        public static string SelectRoleNameByRoleId(string roleId) 
        {
            string sql = " select * from zldc_t_s_role where id=" + roleId + "";
            System.Data.DataSet ds = null;
            string roleName = "";
            using (_Database db = new _Database("estate")) 
            {
                ds = db.Query(sql);

            }
            if (ds.Tables[0].Rows.Count > 0) 
            {
                roleName = ds.Tables[0].Rows[0]["name"].ToString();
            }
            return roleName;
        }
    }
}

/*
·Application_Init：在应用程序被实例化或第一次被调用时，该事件被触发。对于所有的HttpApplication 对象实例，它都会被调用。 

·Application_Disposed：在应用程序被销毁之前触发。这是清除以前所用资源的理想位置。 

·Application_Error：当应用程序中遇到一个未处理的异常时，该事件被触发。 

·Application_Start：在HttpApplication 类的第一个实例被创建时，该事件被触发。它允许你创建可以由所有HttpApplication 实例访问的对象。 

·Application_End：在HttpApplication 类的最后一个实例被销毁时，该事件被触发。在一个应用程序的生命周期内它只被触发一次。 

·Application_BeginRequest：在接收到一个应用程序请求时触发。对于一个请求来说，它是第一个被触发的事件，请求一般是用户输入的一个页面请求（URL）。 

·Application_EndRequest：针对应用程序请求的最后一个事件。 

·Application_PreRequestHandlerExecute：在 ASP.NET 页面框架开始执行诸如页面或 Web 服务之类的事件处理程序之前，该事件被触发。 

·Application_PostRequestHandlerExecute：在 ASP.NET 页面框架结束执行一个事件处理程序时，该事件被触发。 

·Applcation_PreSendRequestHeaders：在 ASP.NET 页面框架发送 HTTP 头给请求客户（浏览器）时，该事件被触发。 

·Application_PreSendContent：在 ASP.NET 页面框架发送内容给请求客户（浏览器）时，该事件被触发。 

·Application_AcquireRequestState：在 ASP.NET 页面框架得到与当前请求相关的当前状态（Session 状态）时，该事件被触发。 

·Application_ReleaseRequestState：在 ASP.NET 页面框架执行完所有的事件处理程序时，该事件被触发。这将导致所有的状态模块保存它们当前的状态数据。 

·Application_ResolveRequestCache：在 ASP.NET 页面框架完成一个授权请求时，该事件被触发。它允许缓存模块从缓存中为请求提供服务，从而绕过事件处理程序的执行。 

·Application_UpdateRequestCache：在 ASP.NET 页面框架完成事件处理程序的执行时，该事件被触发，从而使缓存模块存储响应数据，以供响应后续的请求时使用。 

·Application_AuthenticateRequest：在安全模块建立起当前用户的有效的身份时，该事件被触发。在这个时候，用户的凭据将会被验证。 

·Application_AuthorizeRequest：当安全模块确认一个用户可以访问资源之后，该事件被触发。 

·Session_Start：在一个新用户访问应用程序 Web 站点时，该事件被触发。 

·Session_End：在一个用户的会话超时、结束或他们离开应用程序 Web 站点时，该事件被触发。
*/